package com.munhrasoft.dinamica.managedbeans;

import java.io.IOException;
import java.util.List;
import java.util.logging.Logger;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.event.TabChangeEvent;

import com.munhrasoft.dinamica.business.entities.CustoCNotas;
import com.munhrasoft.dinamica.business.entities.CustoCRI;
import com.munhrasoft.dinamica.business.entities.ParametrosCusto;
import com.munhrasoft.dinamica.business.logic.CustoCNotasEJB;
import com.munhrasoft.dinamica.business.logic.CustoCRIEJB;
import com.munhrasoft.dinamica.business.logic.ParametrosEJB;

@ManagedBean
@ViewScoped
public class ParametrosController {

    /*
     * Acho que nao vai precisar de ficar inicializando direto os objetos como no exemplo do
     * tabchanged, acho que quem anulava o objeto de pesquisa era o datatable
     */

    private static Logger     logger = Logger.getLogger(ParametrosController.class.getName());
    @EJB
    private CustoCNotasEJB    custoCNotasEJB;
    @EJB
    private CustoCRIEJB       custoCRIEJB;
    @EJB
    private ParametrosEJB     parametrosEJB;

    private List<CustoCNotas> custoCNotasList;
    private List<CustoCRI>    custoCRIList;
    private ParametrosCusto   parametroCusto;

    @PostConstruct
    public void init() {
        logger.info("PostConstruct");
        custoCNotasList = custoCNotasEJB.fetchAllCustoCNotas();
        custoCRIList = custoCRIEJB.fetchAllCustoCRI();
        parametroCusto = parametrosEJB.pegaParamCusto();
    }

    public void salvaCustoParams(ActionEvent actionEvent) {
        logger.info("salvaCustoParams");
        parametroCusto = parametrosEJB.atualizaParamCusto(parametroCusto);

        if (parametroCusto != null) {
            showMessage(FacesMessage.SEVERITY_INFO, "Operação concluída",
                    "Parametros de custo atualizados com sucesso");
        } else {
            showMessage(FacesMessage.SEVERITY_ERROR, "Erro", "Os parametros nao foram atualizados");
        }

    }

    public void handleCriXLS(FileUploadEvent event) {
        logger.info("handleCriXLS file name " + event.getFile().getFileName());
        try {
            custoCRIEJB.reloadCustoCRINotas(event.getFile().getInputstream());
            custoCRIList = custoCRIEJB.fetchAllCustoCRI();
            showMessage(FacesMessage.SEVERITY_INFO, "Operação concluída",
                    "Tabela de custos do cartorio de registros carregada");
        } catch (IOException e) {
            showMessage(FacesMessage.SEVERITY_ERROR, "Erro",
                    "Falha ao carregar tabela de custos do cartorio de registros");

            e.printStackTrace();
        }
    }

    public void handleCnotasXLS(FileUploadEvent event) {
        logger.info("handleFileUpload file name " + event.getFile().getFileName());
        try {
            custoCNotasEJB.reloadCustoCNotas(event.getFile().getInputstream());
            custoCNotasList = custoCNotasEJB.fetchAllCustoCNotas();
        } catch (IOException e) {
            e.printStackTrace();
            showMessage(FacesMessage.SEVERITY_ERROR, "Operação falhou",
                    "Erro ao carregar o arquivo");
        }
        showMessage(FacesMessage.SEVERITY_INFO, "Operação concluída",
                "Arquivo de checklist carregado");
    }

    public void changeTabView(TabChangeEvent event) {
        logger.info("Tabview changed ");
    }

    private void showMessage(Severity sev, String summary, String detail) {
        FacesMessage message = new FacesMessage(sev, summary, detail);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    public CustoCNotasEJB getCustoCNotasEJB() {
        return custoCNotasEJB;
    }

    public void setCustoCNotasEJB(CustoCNotasEJB custoCNotasEJB) {
        this.custoCNotasEJB = custoCNotasEJB;
    }

    public List<CustoCNotas> getCustoCNotasList() {
        return custoCNotasList;
    }

    public void setCustoCNotasList(List<CustoCNotas> custoCNotasList) {
        this.custoCNotasList = custoCNotasList;
    }

    public List<CustoCRI> getCustoCRIList() {
        return custoCRIList;
    }

    public void setCustoCRIList(List<CustoCRI> custoCRIList) {
        this.custoCRIList = custoCRIList;
    }

    public ParametrosCusto getParametroCusto() {
        return parametroCusto;
    }

    public void setParametroCusto(ParametrosCusto parametroCusto) {
        this.parametroCusto = parametroCusto;
    }

}
